/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
/**************************
 * \if English
 * @Date:2016.1.23
 * @Author:steven
 * @Brief:
 * @Detail:
 * @Editor:
 * @Brief:
 * \else
 *
 * @创建日期：2016年1月23日
 * @作者：华磊
 * @大概功能：包含所有的指令信息，以及该程序的名称，指令运行的行数、
 * 要call的program的名称
**************************/
#ifndef PROGRAM_H
#define PROGRAM_H


#include "line.h"

#include <QVector>

#include <QDateTime>
#include <QString>
#include <QMap>
#include <QList>
#include <QPair>
#include <QMultiMap>
#include <QDebug>
#include <QRegExp>
#include <QStringList>


typedef QPair<int,int> PairEndFor;

typedef QPair<int,PairEndFor> MapPairFor;

typedef QMultiMap<int,MapPairFor> MapListFor;

/**
 * @brief The Program class 单个用户程序信息容器类
 */
class Program : public QVector <Line>

{
public:
    Program();


public:
    int needToParseLine;

    /**指向运行程序的行号*/
    int runningLineInt;
    int errorFlag;

    QDateTime creationDate;
    QDateTime modificationDate;
    QString copySource;
    bool position;
//    int size;

    /**父亲program的名称*/
    QString fatherProgramName;

    /**本程序(program)的名称*/
    QString thisProgramName;
    SUB_TYPE subType;
    QString comment;
    QString groupMask;//???
    bool writeProtection;
    bool ignorePause;
    int stackSize;

    /**program的运行状态，初始program[0]运行状态初始化为true，
     * 其余为false，当调用run时，被调用的program运行状态为true，
     * 当调用call时，调用call的program的运行状态为false，被调用
     * 的program的运行状态为true
    */
    bool runState;
    /**计数器，初始值为0，当遇到for时forCount++，当遇到endfor时forCount--，如果forCount为0，则表示找到与该for相匹配的endfor*/
    int forCount;

    bool smoothFlag;

    /**QPair类型，first里面装的是相匹配的endfor的行号，second里面装的是targetValue*/
    PairEndFor pairEndFor;
    /**QPair类型，first里面装的是当前的for的行号，second里面装的是pairEndFor*/
    MapPairFor mapPairFor;
    /**QMultiMap类型，key为programNum，values为MapListFor*/
    MapListFor mapListFor;
    /**
     * @brief breakPointFlag         是否有断点的标志
     */
    bool breakPointFlag;
    /**
     * @brief breakPointList        打断点的行号
     */
    QVector <int> breakPointList;
    /**
     * @brief motionMap             预处理的运动指令，１、起始的ｐｃ　２、长度
     */
    QMap <int,int>  motionMap;


    QVector <float> r;

    bool pauseFlag;

    bool timeOutFlag;
    struct timeval waitTimeStart,waitTimeEnd;

    QVector <QVector<int> > pr;

    QVector <QVector <int> > plList;

    QVector <int> arList;
    QVector <int> prList;
    QVector <QVector <int> > pr2List;
    QVector <int> Gi;
    QVector <int> Go;
    QVector <int> Ai;
    QVector <int> Ao;
    QVector <int> Di;
    QVector <int> Do;
    QVector <int> Ri;
    QVector <int> Ro;
    QVector <int> Si;
    QVector <int> So;
    QVector <int> Ui;
    QVector <int> Uo;
    QVector <int> timer_overflow;
    QVector <int> uframeList;
    QVector <int> utoolList;

    QVector <int> pointList;

    QVector <int>  userNumList;
    QVector <int>  toolNumList;

    QVector <QString> programStrList;

};




#endif // PROGRAM_H

